IMPORTS

initializing a dummy basemap to project station positions

Loading needed data

Calculating center of mass of each clusters

for each station and for each month take all the calculated trajectories and plot them
plot a hexbin map to get a heatmap
for each trajectory calculate if it pass at a distance lower then a given threshold to each of the clusters centroids (contribution of cluster to station is plotted by size of cluster centroids, in red)
store this information

Calculate trajectories to stations

Year: 2021
Months: January, July
Days: All
Hours: 0, 6, 12, 18
Altitudes: 5, 25, 50
Locations: each station
runtime: 10 days back-tracjetory

for idx, row in tqdm(stazioni.iterrows()): location = list((row.latitude, row.longitude)) for month in [1, 7]: run_and_visualize_hysplit(basename = f"station_{idx}_month_{month}", years = [2011], months = [month], days = slice(1, 31, 1), hours = [0, 6, 12, 18], altitudes=[5, 25, 50], location=[location], runtime=-240)

Calculate trajectories from clusters

for idx, row in tqdm(centers_of_mass.iterrows()): location = list((row.y, row.x)) for month in [1, 7]: run_and_visualize_hysplit(basename = f"cluster_{idx}_month_{month}", years = [2011], months = [month], days = slice(1, 31, 1), hours = [0, 6, 12, 18], altitudes=[5, 25, 50], location=[location], runtime=240)

Stat to Clust

compute influences

Aggregate influence infos

Build viz

Backward from stations

Clust to Staz

Forward from Clusters

Backward from Clusters
for clust_num in clust_nums: for month in months: traj_id = f'reversetraj/cluster_{clust_num}_month_{month}' traj_data = traj_data_from_path(traj_id) fig, axes = plt.subplots(figsize=(20, 10), nrows=1, ncols=2) m1, m2 = visualize_trajectories(axes, traj_data['group'], traj_data['coords']) clust_x_proj, clust_y_proj = m2(clust_x, clust_y) if month==1: m2.scatter(stazioni_x, stazioni_y, color='blue', zorder=5, s=jans_staz_influence[clust_num], ax=axes[1]) else: m2.scatter(stazioni_x, stazioni_y, color='blue', zorder=5, s=juls_staz_influence[clust_num], ax=axes[1]) m1.scatter(clust_x[clust_num], clust_y[clust_num], color='black', zorder=5, s=50, ax=axes[0]) m2.scatter(clust_x[clust_num], clust_y[clust_num], color='white', zorder=5, s=50, ax=axes[1]) fig.suptitle(f'Cluster numero: {clust_num} Mese: {months_dict[month]}', fontsize=16) axes[0].set_title(f"Traiettorie") axes[1].set_title(f"Stazioni coinvolti") plt.show()
Forward from station
for stat_num in tqdm(stat_nums): for month in months: traj_id = f'reversetraj/station_{stat_num}_month_{month}' traj_data = traj_data_from_path(traj_id) fig, axes = plt.subplots(figsize=(20, 10), nrows=1, ncols=2) m1, m2 = visualize_trajectories(axes, traj_data['group'], traj_data['coords'], direction='backward') clust_x_proj, clust_y_proj = m2(clust_x, clust_y) if month==1: m2.scatter(clust_x_proj, clust_y_proj, color='blue', zorder=5, s=jans_clust_influence[stat_num], ax=axes[1]) else: m2.scatter(clust_x_proj, clust_y_proj, color='blue', zorder=5, s=juls_clust_influence[stat_num], ax=axes[1]) m1.scatter(stazioni_x[stat_num], stazioni_y[stat_num], color='black', zorder=5, s=50, ax=axes[0]) m2.scatter(stazioni_x[stat_num], stazioni_y[stat_num], color='white', zorder=5, s=50, ax=axes[1]) fig.suptitle(f'Stazione numero: {stat_num} Mese: {months_dict[month]}', fontsize=16) axes[0].set_title(f"Traiettorie") axes[1].set_title(f"Clusters coinvolti") plt.show()

Visualize normalized contribution for each station and for each month

General flow winter

GENERATE CLUSTERS

Visualize aggreagate